package algoWing42.modelo;


public class Bombardero extends AvionEnemigo {
	/**
	 * 
	 */
	private static final long serialVersionUID = 179786587387971802L;
	private int contadorMovimientos;
	private int direccion;
	
	public static final int RADIO_BOMBARDERO = 30;
	public static final int VALOR_PUNTOS_BOMBARDERO = 30;
	public static final int ENERGIA_BOMBARDERO = 20;
	public static final int CANTIDAD_MOVIMIENTOS_HASTA_CAMBIAR_DIRECCION = 10; //mantener fijo
	public static final int VELOCIDAD_BOMBARDERO_VERTICAL = 2;
	public static final int VELOCIDAD_BOMBARDERO_HORIZONTAL = 1;
	public static final double PROB_DISPARAR_BOMBARDERO = 0.02;

	public Bombardero(int x, int y) {
		super(x, y, RADIO_BOMBARDERO);
		inicializarBombardero();		
	}

	public Bombardero(Punto posicion) {
		super(posicion.getX(), posicion.getY(), RADIO_BOMBARDERO);
		inicializarBombardero();
	}
	
	private void inicializarBombardero() {
		this.valorEnPuntos = VALOR_PUNTOS_BOMBARDERO;
		this.energia = ENERGIA_BOMBARDERO;
		this.direccion = 1;
		this.contadorMovimientos = 0;
	}

	private void dejarPackDeArmamento() {
		PackDeArmamento temp = new PackDeArmamento(this.getArea().getPosicion());
		Juego.singleton().agregarItem(temp);
	}

	/***
	 * "Alterna un movimiento hacia abajo y otro hacia la derecha, cada 10
	 * movimientos cambia el sentido en el que iba (izq o der). Ej:
	 * abajo(1)-derecha(2)..abajo(9)-derecha(10)->abajo(1)-izquierda(2).."
	 **/
	@Override
	protected void mover() {
		if (contadorMovimientos >= CANTIDAD_MOVIMIENTOS_HASTA_CAMBIAR_DIRECCION) {
			contadorMovimientos = 0;
			direccion = (-1) * VELOCIDAD_BOMBARDERO_HORIZONTAL;
		}
						
		if ((contadorMovimientos % 2) == 0) {
			this.moverEnDireccion(0, VELOCIDAD_BOMBARDERO_VERTICAL);
		} else 
			this.moverEnDireccion(direccion, 0);
		
		contadorMovimientos++;
	}

	@Override
	protected void destruir() {
		super.destruir();
		this.dejarPackDeArmamento();
	}

	private void dispararCohete() {
		Cohete disparoTemp = new Cohete(this.getArea().getPosicion(), false);
		Juego.singleton().agregarDisparoEnemigo(disparoTemp);
	}

	private void dispararLaser() {
		Laser disparoTemp = new Laser(this.getArea().getPosicion(), false);
		Juego.singleton().agregarDisparoEnemigo(disparoTemp);
	}

	private void dispararTorpedoRastreador() {
		TorpedoRastreador disparoTemp = new TorpedoRastreador(this.getArea()
				.getPosicion());
		Juego.singleton().agregarDisparoEnemigo(disparoTemp);
	}

	/***
	 * Se mueve y con 2/5 de probabilidad dispara un arma. Si cae en el 2/5 ->
	 * tiene 1/3 de prob. de disparar cada arma.
	 */
	@Override
	public void vivir() {
		double numeroRandom = Math.random();
		this.mover();
		
		if (numeroRandom < PROB_DISPARAR_BOMBARDERO) {
			numeroRandom = Math.random();

			if (numeroRandom < 0.33) {
				this.dispararLaser();
			}

			if ((numeroRandom > 0.33) & (numeroRandom < 0.66)) {
				this.dispararCohete();
			}

			if (numeroRandom > 0.66) {
				this.dispararTorpedoRastreador();
			}
		}
	}
	
	public int getDireccion() {
		return direccion;
	}
}
